/**
 * SQL拼接工具
 * 由于不像使用MyBatis工具那样,
 * 所以在一些复杂场景中,我们需要判断对象中属性是否存在
 * 存在拼接,否则不拼接
 * @name: SqlSplicingUtil
 * @data: 2024/4/8 13:37
 */

/**
 * 我们这里只抽象拼接
 * 至于具体的增删改查还是以前的SQL
 * 也就是说我们这个方法拿一个对象,和一个需要进行拼接的符号,如:逗号,and,or
 *
 * 给我一个对象
 * 判断给我对象是否有值,
 * 如果有值,就拼接,如果没有值,
 * 那我们遍历的依据是什么?
 * 即对象中所有key,但是我们再想想
 * 数据库的字段和我们在代码使用的命名规范有可能不同
 * 所以,此时我们需要去对数据库字段进行定义一个变量进行判断
 *
 * @param object 需要进行拼接的对象
 * @param isConversionField 是否需要转换为下划线,默认为不转换
 * @param splicingSymbol 对象中拼接的符号,默认为逗号
 * @param fieldSplicingSymbol 字段拼接符号,即字段与字段值中拼接的符号
 *
 */
export function getSql<T>(object: T, isConversionField = true, splicingSymbol = ",", fieldSplicingSymbol="="): string {
  let objectKeyList = Object.keys(object);
  if (isConversionField) {
    objectKeyList = objectKeyList.map((value) => {
      //以下代码为网络复制过来的,
      //功能是通过正则找到大写字母,将其转为小写,并在其前面加上splicingSymbol
      let temp = value.replace(/[A-Z]/g, function (match) {
        return '_' + match.toLowerCase();
      });
      // 如果首字母是大写，执行replace时会多一个_，这里需要去掉
      if (temp.slice(0, 1) === '_') {
        temp = temp.slice(1);
      }
      return temp;
    });
  }
  const sqlItemList=objectKeyList.map((value, index) => {
    if (object[value]){
      /**
       * 这里我们还需要判断以下类型
       * 目前我们暂时只判断两个数据类型
       * 即 字符串类型 和 数值类型
       *
       * */
      // console.log(typeof object[value]);
      if (typeof object[value]==="string"){
        return value+fieldSplicingSymbol+`'${object[value]}'`;
      }else{
        return value+fieldSplicingSymbol+object[value];
      }
    }
  });
  return sqlItemList.filter((item) => {
    return item;
  }).join(splicingSymbol);
}


